
pt map(pt P, pt A, pt B, pt C, pt Q, pt R, pt S) {
  float x = s(V(A, P), V(A, C))/s(V(A, B), V(A, C));
  float y = s(V(A, P), V(A, B))/s(V(A, C), V(A, B));
  return T(T(Q, x, V(Q, R)), y, V(Q, S));
}

pt map(pt P, pt O, vec I, vec J, pt Q, vec U, vec V) {
  float x = s(V(O, P), J)/s(I, J);
  float y = s(V(O, P), I)/s(J, I);
  return T(T(Q, x, U), y, V);
}


frame F(pt A, pt B, pt C) {
  return new frame(A, B, C);
}
class frame {       // frame [O I J]
  pt O = P();
  vec I = V(1, 0);
  vec J = V(0, 1);
  frame() {
  }
  frame(pt pO, vec pI, vec pJ) {
    O.setTo(pO); 
    I.setTo(pI); 
    J.setTo(pJ);
  }
  frame(pt A, pt B, pt C) {
    O.setTo(A); 
    I=V(A, B); 
    J=V(A, C);
  }
  void display() {
    show(O, 3); 
    arrow(O, I); 
    show(O, J);
  }
  pt toLocal(pt P) {
    return P( s(V(O, P), J)/s(I, J), s(V(O, P), I)/s(J, I) );
  }
  pt toGlobal(pt P) {
    return T(T(O, P.x, I), P.y, J);
  }
}  // end frame

pt transform(pt P, frame F0, frame F1) {
  return F1.toGlobal(F0.toLocal(P));
}

